package com.djf.djfpgsql.mapper;

/**
 * @Author djf
 * @Date 2025/1/10
 * @Version 1.0
 */

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.djf.djfpgsql.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;
import java.util.Map;

/**
 * 用户Mapper - 展示MySQL和PostgreSQL的核心SQL差异
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {

    // ==================== 1. 字符串模糊查询差异 ====================
    
    /**
     * MySQL版本：使用 LIKE + CONCAT 进行模糊查询
     * CONCAT函数拼接字符串，LIKE区分大小写
     */
    @Select("SELECT * FROM user WHERE username LIKE CONCAT('%', #{keyword}, '%') OR nickname LIKE CONCAT('%', #{keyword}, '%')")
    List<User> searchUsersByNameMySQL(@Param("keyword") String keyword);
    
    /**
     * PostgreSQL版本：使用 ILIKE + || 进行模糊查询
     * ||操作符拼接字符串，ILIKE不区分大小写
     */
    @Select("SELECT * FROM user WHERE username ILIKE '%' || #{keyword} || '%' OR nickname ILIKE '%' || #{keyword} || '%'")
    List<User> searchUsersByNamePGSQL(@Param("keyword") String keyword);

    // ==================== 2. 日期函数差异 ====================
    
    /**
     * MySQL版本：使用 DATE_SUB 和 NOW() 函数
     */
    @Select("SELECT * FROM user WHERE register_time >= DATE_SUB(NOW(), INTERVAL #{days} DAY) ORDER BY register_time DESC")
    List<User> getRecentUsersMySQL(@Param("days") Integer days);
    
    /**
     * PostgreSQL版本：使用 INTERVAL 语法
     */
    @Select("SELECT * FROM user WHERE register_time >= NOW() - INTERVAL '#{days} days' ORDER BY register_time DESC")
    List<User> getRecentUsersPGSQL(@Param("days") Integer days);

    // ==================== 3. JSON字段操作差异 ====================
    
    /**
     * MySQL版本：使用 JSON_EXTRACT 函数
     * profile字段存储格式：{\"city\": \"北京\", \"hobby\": \"编程\", \"education\": \"本科\"}
     */
    @Select("SELECT * FROM user WHERE JSON_EXTRACT(profile, '$.city') = #{city}")
    List<User> findUsersByCityMySQL(@Param("city") String city);
    
    /**
     * PostgreSQL版本：使用 ->> 操作符
     * profile字段存储格式：{\"city\": \"北京\", \"hobby\": \"编程\", \"education\": \"本科\"}
     */
    @Select("SELECT * FROM user WHERE profile->>'city' = #{city}")
    List<User> findUsersByCityPGSQL(@Param("city") String city);

    // ==================== 4. 布尔值处理差异 ====================
    
    /**
     * MySQL版本：布尔值用 1/0 表示
     */
    @Select("SELECT COUNT(*) as total_users, " +
            "SUM(CASE WHEN is_active = 1 THEN 1 ELSE 0 END) as active_users, " +
            "AVG(age) as avg_age, " +
            "AVG(balance) as avg_balance " +
            "FROM user")
    Map<String, Object> getUserStatisticsMySQL();
    
    /**
     * PostgreSQL版本：布尔值用 true/false 表示
     */
    @Select("SELECT COUNT(*) as total_users, " +
            "SUM(CASE WHEN is_active = true THEN 1 ELSE 0 END) as active_users, " +
            "AVG(age) as avg_age, " +
            "AVG(balance) as avg_balance " +
            "FROM user")
    Map<String, Object> getUserStatisticsPGSQL();

    // ==================== 5. 时间戳更新差异 ====================
    
    /**
     * MySQL版本：使用 NOW() 函数
     */
    @Update("UPDATE user SET last_login = NOW() WHERE id = #{id}")
    int updateLastLoginMySQL(@Param("id") Long id);
    
    /**
     * PostgreSQL版本：使用 CURRENT_TIMESTAMP
     */
    @Update("UPDATE user SET last_login = CURRENT_TIMESTAMP WHERE id = #{id}")
    int updateLastLoginPGSQL(@Param("id") Long id);

    // ==================== 6. 排序和限制 ====================
    
    /**
     * MySQL版本：LIMIT语法（执行计划和优化策略不同）
     */
    @Select("SELECT * FROM user ORDER BY balance DESC LIMIT #{limit}")
    List<User> getTopUsersByBalanceMySQL(@Param("limit") Integer limit);
    
    /**
     * PostgreSQL版本：LIMIT语法（执行计划和优化策略不同）
     */
    @Select("SELECT * FROM user ORDER BY balance DESC LIMIT #{limit}")
    List<User> getTopUsersByBalancePGSQL(@Param("limit") Integer limit);
}
